package br.com.projetosivan.controller;

import java.io.File;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;
import org.richfaces.event.FileUploadEvent;
import org.richfaces.model.UploadedFile;
import br.com.projetosivan.dao.FotoProdutoDao;
import br.com.projetosivan.dao.ProdutoDao;
import br.com.projetosivan.dao.impl.FotoProdutoDaoImp;
import br.com.projetosivan.dao.impl.ProdutoDaoImp;
import br.com.projetosivan.model.FotoProduto;
import br.com.projetosivan.model.Produto;
import br.com.projetosivan.model.TipoProduto;

@ManagedBean
@SessionScoped
public class ProdutoController{

    private Produto produto;
    private DataModel listaProdutos;
    private Long idTipoProduto = new Long(0);
    private ArrayList<File> files = new ArrayList<File>();
    private ArrayList<byte[]> listupload = new ArrayList<byte[]>();
    private String lastTipoProduto;
    private String systemPath = "c:/app/images/produtos/";
    
    public DataModel getListarProdutos() {
        List<Produto> lista = new ProdutoDaoImp().list();
        listaProdutos = new ListDataModel(lista);
        return listaProdutos;
    }
    
	public String getSystemPath() {
		return systemPath;
	}

	public void setSystemPath(String systemPath) {
		this.systemPath = systemPath;
	}

	public Produto getProduto() {
        return produto;
    }
    public void setProduto(Produto produto) {
        this.produto = produto;
    }
    public void setSobEncomenda(boolean value){
    	this.produto.setSobEncomenda((value == true)? 1 : 0);
    }
    
    public boolean getSobEncomenda(){
    	return (this.produto.getSobEncomenda()!= null && this.produto.getSobEncomenda() == 1 )? true : false;
    }
    
    public Long getIdTipoProduto() {
		return idTipoProduto;
	}
	public void setIdTipoProduto(Long idTipoProduto) {
		this.idTipoProduto = idTipoProduto;
	}

	public Produto getProdutoById(Long id) {
		ProdutoDao dao = new ProdutoDaoImp();
        return dao.getProduto(id);
    }	
	
	public String prepararAdicionarProduto(){
        produto = new Produto();
        idTipoProduto = new Long(0);
        listupload = new ArrayList<byte[]>();
        return "gerenciarProduto";
    }
    public String prepararAlterarProduto(){
        produto = (Produto)(listaProdutos.getRowData());
        listupload = new ArrayList<byte[]>();
		if(produto.getTipoProduto() != null){
		   	 idTipoProduto = produto.getTipoProduto().getId();
		}else{
			idTipoProduto = new Long(0);
		}
        return "gerenciarProduto";
    }
    public String excluirProduto(){
        Produto produtoTemp = (Produto)(listaProdutos.getRowData());
        ProdutoDao dao = new ProdutoDaoImp();
        dao.remove(produtoTemp);
        return "cadastrarProduto";
    }
    public String adicionarProduto(){
        ProdutoDao dao = new ProdutoDaoImp();
        produto.setDataCadastro(new Date());
        if(idTipoProduto != null && idTipoProduto != 0){
        	 produto.setTipoProduto(new TipoProduto());
             produto.getTipoProduto().setId(idTipoProduto);
        }
        
        Long idproduto = dao.save(produto);
        
        FotoProdutoDao fotodao = new FotoProdutoDaoImp();
        for(int i = 0 ; i < listupload.size() ; i++){
        	FotoProduto fp = new FotoProduto();
        	fp.setNumOrdem(i+1);
        	String caminho = "produto_"+idproduto+"_"+fp.getNumOrdem()+".jpg";
        	fp.setCaminho(caminho);
        	fp.setProduto(new Produto());
        	fp.getProduto().setId(idproduto);
        	fotodao.save(fp);
        	File f = new File(systemPath+caminho);
        	if(i == 0){
        		produto.setImgpath(caminho);
        	}
        	try{
        	   FileOutputStream out = new FileOutputStream(f);
               out.write(listupload.get(i));
               out.close();  
               out.flush();
           }catch(Exception e){
        	   e.printStackTrace();
           }
           dao.update(produto);
        }
        
        return "cadastrarProduto";
    }
    public String alterarProduto(){
        ProdutoDao dao = new ProdutoDaoImp();
        if(idTipoProduto != null && idTipoProduto != 0){
       	 	produto.setTipoProduto(new TipoProduto());
            produto.getTipoProduto().setId(idTipoProduto);
        }
        
        FotoProdutoDao fotodao = new FotoProdutoDaoImp();
        
        List<FotoProduto> fotosantigas =  fotodao.getListFotoProduto(produto.getId());
        
        if(listupload.size() != 0){
        	fotodao.removeAll(fotosantigas);
        	for(int i = 0 ; i < listupload.size() ; i++){
        		FotoProduto fp = new FotoProduto();
            	fp.setNumOrdem(i+1);
            	String caminho = "produto_"+produto.getId()+"_"+fp.getNumOrdem()+".jpg";
            	fp.setCaminho(caminho);
            	fp.setProduto(new Produto());
            	fp.getProduto().setId(produto.getId());
            	fotodao.save(fp);
            	File f = new File(systemPath+caminho);
            	if(i == 0){
            		produto.setImgpath(caminho);
            	}
               try{
            	   FileOutputStream out = new FileOutputStream(f);
                   out.write(listupload.get(i));
                   out.close();  
                   out.flush();
               }catch(Exception e){
            	   e.printStackTrace();
               }
            }
        	dao.update(produto);
        }
        
        return "cadastrarProduto";
    }
    
    public void listener(FileUploadEvent event) throws Exception {
        UploadedFile item = event.getUploadedFile();
        listupload.add(item.getData());
    }
    
    public List<String> getImagesByProduto(Long id){
    	FotoProdutoDao dao = new FotoProdutoDaoImp();
    	List<FotoProduto> list = dao.getListFotoProduto(id);
    	List<String> caminhos = new ArrayList<String>();
    	for(int i = 0 ; i < list.size() ; i++){
    		caminhos.add(list.get(i).getCaminho());
    	}
    	return caminhos;
    }
    
    public List<Produto> getProdutosByTipoProduto(Long id){
    	List<Produto> produtos = new ProdutoDaoImp().getProdutosByTipoProduto(id);
    	lastTipoProduto = id.toString();
    	return produtos;
    }
    
    public String clearUploadData() {
        files.clear();
        return null;
    }
    
    public int getSize() {
        if (getFiles().size() > 0) {
            return getFiles().size();
        } else {
            return 0;
        }
    }
    
    public long getTimeStamp() {
        return System.currentTimeMillis();
    }
 
    public ArrayList<File> getFiles() {
        return files;
    }
 
    public void setFiles(ArrayList<File> files) {
        this.files = files;
    }

	public String getLastTipoProduto() {
		return lastTipoProduto;
	}

	public void setLastTipoProduto(String lastTipoProduto) {
		this.lastTipoProduto = lastTipoProduto;
	}
}